/**
 * 模拟DeepSeek API的流式响应
 * 注意：仅用于开发和演示目的
 */

// 创建一个流式响应的拦截函数
// 该函数会替换全局的fetch方法，以拦截对DeepSeek API的请求
export const setupMockStreamResponse = () => {
  // 保存原始fetch方法，以便在非模拟情况下使用
  const originalFetch = window.fetch;
  
  // 模拟API响应：替换全局fetch方法
  window.fetch = async function(input: RequestInfo | URL, init?: RequestInit) {
    const url = input instanceof Request ? input.url : input.toString();
    
    // 检查是否是对DeepSeek API的请求
    // 判断URL是否包含chat/completions路径，这是DeepSeek聊天API的端点
    if (url.includes('/api/v1/chat/completions') && init?.body) {
      try {
        // 解析请求体
        const body = JSON.parse(init.body.toString());
        
        // 检查是否请求流式响应
        // 只有stream=true的请求才会被模拟
        if (body.stream === true) {
          return createMockStream(body.messages);
        }
      } catch (e) {
        console.error('解析请求体失败', e);
      }
    }
    
    // 不是模拟的请求，使用原始fetch
    return originalFetch(input, init);
  };
};

// 创建模拟的流式响应
// 根据用户消息生成一个模拟的流式响应
const createMockStream = (messages: any[]) => {
  // 查找最后一条用户消息
  const userMessage = messages.find(m => m.role === 'user')?.content || '';
  // 基于用户消息生成模拟响应文本
  const responseTexts = generateMockResponse(userMessage);
  
  // 创建一个ReadableStream模拟流式响应
  const stream = new ReadableStream({
    async start(controller) {
      // 创建文本编码器，用于将文本转换为字节流
      const encoder = new TextEncoder();
      
      // 模拟流式输出的响应格式
      // 发送初始响应，包含角色信息
      controller.enqueue(encoder.encode('data: {"id":"chatcmpl-mock","object":"chat.completion.chunk","created":1644348134,"model":"deepseek-chat","choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]}\n\n'));
      
      // 添加延迟函数，模拟网络延迟
      const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
      
      // 发送每个字符，模拟真实的打字效果
      for (const text of responseTexts) {
        // 字符之间的随机延迟
        await delay(20 + Math.random() * 80);
        
        const chunk = {
          id: "chatcmpl-mock",
          object: "chat.completion.chunk",
          created: Math.floor(Date.now() / 1000),
          model: "deepseek-chat",
          choices: [
            {
              delta: {
                content: text
              },
              index: 0,
              finish_reason: null
            }
          ]
        };
        
        // 发送数据格式为 'data: {...}\n\n'
        controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`));
      }
      
      // 发送结束标志
      controller.enqueue(encoder.encode('data: [DONE]\n\n'));
      controller.close();
    }
  });
  
  // 创建一个mock的Response对象
  return new Response(stream, {
    headers: {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive'
    },
    status: 200
  });
};

// 根据用户消息生成模拟响应
const generateMockResponse = (userMessage: string): string[] => {
  const lowerCaseMsg = userMessage.toLowerCase();
  let response = '';
  
  if (lowerCaseMsg.includes('你好') || lowerCaseMsg.includes('hello')) {
    response = '你好！我是DeepSeek AI助手，很高兴为你提供帮助。有什么我可以协助你的问题吗？';
  } else if (lowerCaseMsg.includes('天气')) {
    response = '我无法获取实时天气信息，但我可以告诉你如何查询天气预报。你可以使用手机上的天气应用或访问天气网站获取最新天气信息。';
  } else if (lowerCaseMsg.includes('代码')) {
    response = '看起来你对编程感兴趣！我可以提供代码示例：\n\n```python\ndef hello_world():\n    print("Hello, World!")\n\nhello_world()\n```\n\n这是一个简单的Python函数，它会打印"Hello, World!"。';
  } else if (lowerCaseMsg.includes('主题') || lowerCaseMsg.includes('颜色')) {
    response = '我们的应用支持亮色和暗色两种主题。你可以点击右上角的主题切换按钮来更改当前主题。主题颜色使用CSS变量实现，可以非常方便地进行自定义。';
  } else {
    response = '感谢你的提问！我是DeepSeek AI助手，基于先进的大语言模型开发。我可以回答问题、提供信息、生成创意内容，甚至帮助你解决一些编程问题。请随时向我提问，我会尽力提供有用的回答。';
  }
  
  // 将响应拆分为单个字符的数组
  return response.split('');
}; 